package main

import "fmt"

func main() {
	// 1、切片声明  和 数组区别在于没有确认长度
	var arr1 = []int{1, 2, 3}
	fmt.Println(arr1)                                       //[1,2,3]
	fmt.Printf("值：%v,类型:%T,长度:%v\n", arr1, arr1, len(arr1)) //值：[1 2 3],类型:[]int,长度:3

	var arr2 = []int{1: 2, 2: 3, 3: 4}                      //空余补0
	fmt.Printf("值：%v,类型:%T,长度:%v\n", arr2, arr2, len(arr2)) //值：[0 2 3 4],类型:[]int,长度:4

	var arr3 []int
	fmt.Println(arr3 == nil) //true  golang中切片声明后，默认值为nil

	//2、切片循环遍历
	var strSlice = []string{"a", "b", "c", "d"}
	for i, v := range strSlice {
		fmt.Printf("i=%v,v=%v|", i, v) // i=0,v=a|i=1,v=b|i=2,v=c|i=3,v=d|
	}

	//3、基于数组定义切片
	a := [5]int{1, 2, 3, 4, 5}

	b := a[:]                      //获取数组里面所有的值
	fmt.Printf("类型：%T,值：%v", b, b) //[[]int,值：[1 2 3 4 5]    []int 是切片
	//切片截取
	c := a[1:4]    //获取索引1-4（包含1,不包含4  【1,4)  ）的值  左闭右开
	fmt.Println(c) //[2 3 4]
	d := a[2:]     //包含索引2之后的数据
	fmt.Println(d) // [3 4 5]
	e := a[:3]     // 索引3之前的数据
	fmt.Println(e) //[1 2 3]

	//4、基于切片定义切片
	var numSlice = []int{1, 2, 3, 4, 5}
	f := numSlice[1:4]
	fmt.Println(f) //[2 3 4]
	g := numSlice[2:]
	fmt.Println(g) //[3 4 5]
	h := numSlice[:3]
	fmt.Println(h) //[1 2 3]

	//5、关于切片的长度和容量
	/*
	   长度：切片包含的元素个数
	   容量：从第一个元素开始数，到底层数组元素末尾的个数
	   切片s的长度和容量可以通过len(s)和cap(s)来获取
	*/
	s := []int{2, 3, 5, 7, 8, 88}
	fmt.Printf("s长度:%v,s容量:%v\n", len(s), cap(s)) //s长度:6,s容量:6

	t := s[2:]                                    //5, 7, 8, 88
	fmt.Printf("s长度:%v,s容量:%v\n", len(t), cap(t)) //s长度:4,s容量:4

	j := s[2:5]                                   //5, 7, 8     容量4的由来   5,7,8,88
	fmt.Printf("s长度:%v,s容量:%v\n", len(j), cap(j)) //s长度:3,s容量:4
}
